package com.linewell.encryption.services;

/**
 * 密码机加解密统一分装
 * Company: 南威软件股份有限公司
 *
 * @author wucan
 * @date 2019-03-14
 */
public interface SMEncryptionService {


    /**
     * SM3摘要
     *
     * @param secret 进行摘要的字符串
     * @return SM3摘要
     * @throws Exception 异常
     */
    String SM3(String secret) throws Exception;

    /**
     * SM3摘要
     *
     * @param secret 进行摘要的数据（统一转化成字符串进行摘要）
     * @return SM3摘要
     * @throws Exception 异常
     */
    String SM3ToBase64(String secret) throws Exception;


    /**
     * SM2加密
     *
     * @param secret 需要加密的对象
     * @return SM2加密后密文
     * @throws Exception 异常
     */
    String encodeSM2(Object secret) throws Exception;

    /**
     * SM2解密
     *
     * @param sign  SM2加密后密文
     * @param clazz 返回对象类型
     * @param <T>   返回对象
     * @return 解密的对象
     * @throws Exception 异常
     */
    <T> T decodeSM2(String sign, Class<T> clazz) throws Exception;


    /**
     * SM4ECB加密
     *
     * @param secret 需要加密的对象
     * @return SM4ECB加密后密文
     * @throws Exception 异常
     */
    String encodeSM4ECB(Object secret) throws Exception;

    /**
     * SM4ECB解密
     *
     * @param sign  SM4ECB加密后密文
     * @param clazz 返回对象类型
     * @param <T>   返回对象
     * @return 解密的对象
     * @throws Exception 异常
     */
    <T> T decodeSM4ECB(String sign, Class<T> clazz) throws Exception;


    /**
     * SM4CBC加密
     *
     * @param secret 需要加密的对象
     * @return SM4CBC加密后密文
     * @throws Exception 异常
     */
    String encodeSM4CBCToIv(Object secret) throws Exception;

    /**
     * SM4CBC解密
     *
     * @param sign  SM4CBC加密后密文
     * @param clazz 返回对象类型
     * @param <T>   返回对象
     * @return 解密的对象
     * @throws Exception 异常
     */
    <T> T decodeSM4CBCToIv(String sign, Class<T> clazz) throws Exception;

    /**
     * SM2私钥签名
     *
     * @param secret 需要签名的对象
     * @return SM2私钥签名密文
     * @throws Exception 异常
     */
    String signSM2(Object secret) throws Exception;

    /**
     * SM2验证签名
     *
     * @param secret 签名的对象
     * @param sign   签名(base64格式)
     * @return 是否验证成功
     */
    Boolean verifySignSM2(Object secret, String sign);


}
